package main

import (
	"fmt"
	"reflect"
)

func main() {
	var num float64 = 1.2345
	fmt.Println("odl value of pinter: ", num)

	pointer := reflect.ValueOf(&num)
	newValue := pointer.Elem()

	fmt.Println("type of pointer:", newValue.Type())
	fmt.Println("settability of pointer:", newValue.CanSet())

	// 重新赋值
	newValue.SetFloat(77)
	fmt.Println("new value of pointer")

	// 如果reflect.ValueOf的参数不是指针, 会如何?
	pointer = reflect.ValueOf(num)
	// newValue = pointer.Elem() // 如果是非指针会直接嗯panic
}

// instruction
// 1.valueOf 需要传入指针参数，然后可以通过pointer.Elem()去获取所指向的Value
// 2.如果传入的参数不是指针，而是变量，那么
// 通过Elem获取原始值对应的对象则直接panic
// 通过CanSet方法擦好像是否可以设置返回false
// 3.newValue.CanSet() 表示是否可以重新设置其值，如果输出的是true则可以修改，否则不能修改，
// 4.reflect.Value.Elem()表示获取原始值对应的反射对象，只有原始对象才能修改，当前反射对象是不能修改的
// 5.也就是说如果修改反射类型对象，其值必须是"addressable"
// 6.struct或者struct 的嵌套都是一样的判断处理方式
